package vista;

import java.awt.Color;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import modelo.Modelo;
import modelo.Observado;
import modelo.Observador;
import controlador.CreadorDeFuncion;

public class Botonera extends JPanel implements ListSelectionListener,Observado{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private List<Observador> observadores;
	private String f;
	
	public Botonera(Modelo modelo,CreadorDeFuncion creador,VistaGraficador graficador){
		this.setObservadores(new ArrayList<Observador>());
		BotonObservador boton2=new BotonObservador("Borrar Funcion");
		BotonObservador boton3=new BotonObservador("Derivar");
		BotonObservador boton4=new BotonObservador("Integrar");
		BotonObservador boton6=new BotonObservador("Maximo");
		BotonObservador boton7=new BotonObservador("Minimo");
		BotonObservador botonAmpliar =new BotonObservador("Ampliar");
		BotonObservador botonReducir = new BotonObservador("Reducir");
		botonAmpliar.addActionListener(graficador);
		botonReducir.addActionListener(graficador);
		boton2.addActionListener(creador);
		this.agregarObservador(boton2);
		this.agregarObservador(boton3);
		this.agregarObservador(boton4);
		this.agregarObservador(boton6);
		this.agregarObservador(boton7);
		boton3.addActionListener(new VistaDerivada(modelo));
		boton4.addActionListener(new VistaIntegral(modelo,"Calcular Integral"));
		boton6.addActionListener(new VistaMaximo(modelo,"Calcular Maximo"));
		boton7.addActionListener(new VistaMinimo(modelo,"Calcular Minimo"));
		this.add(boton2);
		this.add(boton3);
		this.add(boton4);
		this.add(boton6);
		this.add(boton7);
		this.add(botonAmpliar);
		this.add(botonReducir);
		this.setBackground(Color.darkGray);
	}
	
	private List<Observador> getObservadores(){
		return this.observadores;
	}
	
	private void setObservadores(List<Observador> lista){
		this.observadores=lista;
	}
	
	public String getFuncion(){
		return this.f;
	}
	
	private void setFuncion(String f){
		this.f=f;
	}

	public void valueChanged(ListSelectionEvent arg0) {
		JList lista=(JList) arg0.getSource();
		this.setFuncion((String)lista.getSelectedValue());
		this.cambie();
	}

	public void agregarObservador(Observador obs) {
		this.getObservadores().add(obs);
		
	}

	public void sacarObservador(Observador obs) {
		this.getObservadores().remove(obs);
		
	}

	public void cambie() {
		ListIterator<Observador> iterador=this.getObservadores().listIterator();
		while (iterador.hasNext()){
			Observador obs=(Observador)iterador.next();
			obs.update(this);
		}
		
	}
}
